// import { defineConfig, PluginOption } from 'vite'
// import vue from '@vitejs/plugin-vue'
// import vueJsx from '@vitejs/plugin-vue-jsx'
// import { viteMockServe } from "vite-plugin-mock";
// import { VitePWA } from 'vite-plugin-pwa'
// import viteCompression from 'vite-plugin-compression'
// import styleImport from 'vite-plugin-style-import'

// import getEnv from "./vite-env";


import path from "path";

import type { UserConfig, ConfigEnv } from 'vite';
import pkg from './package.json';
import moment from 'moment';
import { loadEnv } from 'vite';
import { resolve } from 'path';
import { generateModifyVars } from './build/generate/generateModifyVars';
import { createProxy } from './build/vite/proxy';
import { wrapperEnv } from './build/utils';
import { createVitePlugins } from './build/vite/plugin';
import { OUTPUT_DIR } from './build/constant';


const resolvePath = (dir: string) => path.join(__dirname, dir)

function pathResolve(dir: string) {
  return resolve(process.cwd(), '.', dir);
}

const { dependencies, devDependencies, name, version } = pkg;
const __APP_INFO__ = {
  pkg: { dependencies, devDependencies, name, version },
  lastBuildTime: moment().format('YYYY-MM-DD HH:mm:ss'),
};

// https://vitejs.dev/config/
export default ({ command, mode }:ConfigEnv): UserConfig => {
  // const env = getEnv(mode)
  // console.log(env);

  const root = process.cwd();

  const env = loadEnv(mode, root);

  // The boolean type read by loadEnv is a string. This function can be converted to boolean type
  const viteEnv = wrapperEnv(env);

  const { VITE_PORT, VITE_PUBLIC_PATH, VITE_PROXY, VITE_DROP_CONSOLE } = viteEnv;

  const isBuild = command === 'build';

  const cfg:UserConfig= {
    base: VITE_PUBLIC_PATH,
    root,
    resolve: {
      alias: [
        // /@/xxxx => src/xxxx
        {
          find: /\/@\//,
          replacement: pathResolve('src') + '/',
        },
        // /#/xxxx => types/xxxx
        {
          find: /\/#\//,
          replacement: pathResolve('types') + '/',
        },
        // ['@vue/compiler-sfc', '@vue/compiler-sfc/dist/compiler-sfc.esm-browser.js'],
      ],
    },
    server: {
      port: VITE_PORT,
      // Load proxy configuration from .env
      proxy: createProxy(VITE_PROXY),
      cors: true, // 允许跨域
      https: false,
    },
    build: {
      target: 'es2015',
      outDir: OUTPUT_DIR,
      terserOptions: {
        compress: {
          keep_infinity: true,
          // Used to delete console in production environment
          drop_console: VITE_DROP_CONSOLE,
          drop_debugger: false
        },
      },
      // Turning off brotliSize display can slightly reduce packaging time
      brotliSize: false,
      chunkSizeWarningLimit: 2000,
      sourcemap: true,
      manifest: true,
      rollupOptions: {
        output: {
          // manualChunks: {
          //   "lodash-es": ['lodash-es']
          // },
          
          manualChunks(id) {
            // if (id.includes('node_modules')) {
            //   return 'vendor';
            // }
            if (id.includes('node_modules')) {
              // console.log(id.toString().split('node_modules/')[1])
              // return "aa";
              return id.toString().split('node_modules/')[1].split('/')[0].toString();
            }
          }
        }
        //   plugins: [
        //     copy({
        //       targets: [{
        //         src: [
        //           './node_modules/bootstrap/dist/js/bootstrap.js',
        //           // './node_modules/***/***/***/***', 
        //           // './node_modules/***/***/***/***'
        //         ],
        //         dest: './dist/***'
        //       }],
        //     })
        //   ]
      },
    },
    define: {
      // setting vue-i18-next
      // Suppress warning
      __VUE_I18N_LEGACY_API__: false,
      __VUE_I18N_FULL_INSTALL__: false,
      __INTLIFY_PROD_DEVTOOLS__: false,
      __APP_INFO__: JSON.stringify(__APP_INFO__),
    },
    css: {
      preprocessorOptions: {
        less: {
          modifyVars: generateModifyVars(),
          javascriptEnabled: true,
        },
      },
      postcss: {
        plugins: [
          require('autoprefixer'),
          require('tailwindcss'),
          // require('postcss-nested'),
          // require('postcss-simple-vars'),
          // require('postcss-import')
        ]
      }
    },

    // The vite plugin used by the project. The quantity is large, so it is separately extracted and managed
    plugins: createVitePlugins(viteEnv, isBuild),

    optimizeDeps: {
      // @iconify/iconify: The dependency is dynamically and virtually loaded by @purge-icons/generated, so it needs to be specified explicitly
      include: [
          '@iconify/iconify',
          'ant-design-vue/es/locale/zh_CN',
          'moment/dist/locale/zh-cn',
          'ant-design-vue/es/locale/en_US',
          'moment/dist/locale/eu',
          
          "moment",
          "axios",
          "mockjs",
          // "echarts",
          // 'echarts/map/js/china',
          "element-plus/lib/locale/lang/zh-cn",
          "element-plus/lib/locale/lang/en",
          '@ant-design/icons-vue',
      ],
      exclude: ['vue-demi','@vueuse/shared/dist/index.esm','@vueuse/core'],
    },
  };
  console.log(cfg);

  return cfg
}
